今天來說些實際會應用的功能吧!
Django 提供了相當方便的 auth 介面,可以讓我們更快速的完成 login/logout 的功能
廢話不多說,我們直接進入正題吧!
如果你還有印象的話,在一開始我們介紹 settings 的時候,就有看到許多預設的設定
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'vendor.apps.VendorConfig', # extra
'welcome.apps.WelcomeConfig', # extra
]
而最下面那兩個 apps 是在前幾天介紹其他 Django 的功能時所建立的,所以實際上在我們創建好一個專案時,Django在這個INSTALLED_APPS
就已經有六個內建的設定,那我們今天要說的是 django.contrib.auth
要使用 Django 內建的 auth 相當的簡單,只要在 urls.py
# 新增 urls.py 再進行修改
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
... 略
path('accounts/', include('django.contrib.auth.urls')), # 新增
]
對於 include 而言, django.contrib.auth.urls
就另一個檔案,以下是它的原始碼
from django.contrib.auth import views
from django.urls import path
urlpatterns = [
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'),
path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),
path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'),
path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]
從上面的原始碼我們可以知道,再我們定義好了 path('logout/', views.LogoutView.as_view(), name='logout')
,等同於是額外新增了以下這些路徑可以使用
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
這些官網也都有提到,但貼在這讓大家充分了解
當然你也可以自行定義這個網只要導向哪裡,這部分就讓大家自行去了解了 (偏題了
接著只要新增我們的 template 就可以了 (((蛤,你在跟我開玩笑?? 這麼快?
沒錯,就是這麼快 ^^"
但是新增這一個 template的位置及名稱是有限制的,要在 top-level 的 template 底下新增 registration 然後新增 login.html
# template/registration/login.html
{% extends "base.html" %}
{% block title %}
Login
{% endblock title %}
{% block content %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login">
</form>
{% endblock content %}
然而,當使用者成功登入以後,我們要幫他轉網址,這時候只要到 settings
新增
LOGIN_REDIRECT_URL = '/'
即可!
說實在話,到目前為止我都還沒有在初始化面建立網頁,我們就來建一下吧!
from django.contrib import admin
from django.urls import path, include
from .views import test
from django.views.generic.base import TemplateView # 新增
urlpatterns = [
...略
path('accounts/', include('django.contrib.auth.urls')),
path('', TemplateView.as_view(template_name='home.html')) # 新增
]
透過 TemplateView 這個 CBV,我們能夠直接把 template的屬性加在後方直接使用!
{% extends "base.html" %}
{% block title %}
HomePage
{% endblock %}
{% block content %}
{% if user.is_authenticated %}
Hello, {{ user.username }}!
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">Login Page</a>
{% endif %}
{% endblock %}
在完成登入之後,就可以看到這個畫面
接著就只剩下登出的動作囉,我們要做的事情跟登入,它需要轉網址的設定,最簡單的方式就是在 settings
新增
LOGOUT_REDIRECT_URL = '/'
並將 home.html 修改成這樣
{% extends "base.html" %}
{% block title %}
HomePage
{% endblock %}
{% block content %}
{% if user.is_authenticated %}
Hello, {{ user.username }}!</br>
<a href="{% url 'logout' %}">Logout</a><br>
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">Login Page</a>
{% endif %}
{% endblock %}
這是登出後的畫面
這樣就完成了一個陽春的登入及登出
今天帶大家了解 Django 內建的 auth 所提供的強大能力,大家只要再費點功夫,把畫面改成自己喜歡的樣子,而我只是帶大家了解如何操作,所以就沒有在 html、css 下太多工夫囉 ^^"
今天介紹到這邊,我們明天見~